let head = null
let end = null
// 缓存存储上限
let limit = null
let hashMap = null

class LRUCache {
    constructor(limit) {
        this.limit = limit
        hashMap = new Map() // 创建一个map哈希存储
    }
    get(key) {
        let node = hashMap.get(key)
        if (node == null) {
            return null
        }
        this.refreshNode(node)
        console.log(node.value)
        return node.value
    }
    /**
     * 中间插入节点
     * @param {*} key
     * @param {*} value
     */
    put(key, value){
        let node = hashMap.get(key)
        if (node == null || node === undefined) {
            // 如果Key 不存在，则插入Key-Value
            if(hashMap.size >= this.limit) { // 超出最大限制,删除左边,最少使用节点
                let oldKey = this.removeNode(head)
                hashMap.delete(oldKey)
            }
            node = new Node(key, value)
            this.addNode(node)
            hashMap.set(key, node)
        } else {
            // 如果Key 存在，则刷新Key-Value
            node.value = value;
            this.refreshNode(node)
        }
    }
    /**
     * 刷新被访问的节点位置
     * @param {*} node node 被访问的节点
     */
    refreshNode(node) {
        //如果访问的是尾节点，则无须移动节点
        if (node == end) {
            return;
        }
        //移除节点
        this.removeNode(node);
        // 重新插入节点
        this.addNode(node);
    }
    remove(key) {
        let node = hashMap.get(key)
        this.removeNode(node)
        hashMap.delete(key)
    }
    /**
     * 删除节点
     * @param {*} node 要删除的节点
     */
    removeNode(node) {
        if (node == head && node == end) {
            // 移除唯一的节点
            head = null;
            end = null
        } else if (node == end) {
            //移除尾节点
            end = end.pre;
            end.next = null;
        } else if (node == head) {
            // 移除头节点
            head = head.next;
            head.pre = null;
        } else {
            // 移除中间节点
            node.pre.next = node.next;
            node.next.pre = node.pre;
        }
        return node.key;
    }
    /**
     * 尾部插入节点,链表最右端是最新被访问的
     * @param {*}  node 要插入的节点
     */
    addNode(node) {
        if (end != null) {
            end.next = node;
            node.pre = end;
            node.next = null;
        }
        end = node;
        if (head == null) {
            head = node
        }
    }
}
class Node {
    constructor(key, value) {
        this.key = key
        this.value = value

        this.pre = null
        this.next = null
    }
}

let lruCache = new LRUCache(5);
lruCache.put("001", " 用户1信息");
lruCache.put("002", " 用户2信息");
lruCache.put("003", " 用户3信息");
lruCache.put("004", " 用户4信息");
lruCache.put("005", " 用户5信息");
lruCache.get("002");
lruCache.put("004", " 用户4信息更新");
lruCache.put("006", " 用户6信息");
lruCache.get("004")
// lruCache.get("006")
console.log(hashMap)